package calculator;

import java.awt.*; 
import java.awt.event.*;

public class Cal {
  public static void main(String[] args) {
    CalFrame f = new CalFrame();
  }
}
class CalFrame extends Frame {
  double d1, d2 ,c;
  int op = 0;
  TextField tf;
  CalPanelL p1;
  CalPanelR p2;
  
  CalFrame()
  {
    super("计算器");

    setLayout(new FlowLayout(1,8,10));
    setBackground(new Color(0,0,0));
    setForeground(Color.white);
    setResizable(false);
    setSize(250,200);
	setLocation(500,250);
     tf = new TextField(22);
     tf.setEditable(false);
     tf.setBackground(Color.white);
     tf.setForeground(Color.black);
     tf.setFont(new Font("Arial",Font.BOLD,16));
     add(tf);
     p1 = new CalPanelL();
     p2 = new CalPanelR();
    add(p1);
    add(p2);
    
    setVisible(true);
    addWindowListener(new Wclose());}
 

  class CalButton extends Button {
    CalButton(String s){
      super(s);
      setBackground(Color.black);
    }
  }

  class CalPanelL extends Panel {
    CalButton b0, b1, b2, b3,
              b4, b5, b6, b7,
              b8, b9, bPN, bPoint;
    CalPanelL() 
	{
      setLayout(new GridLayout(4,3));
      setFont(new Font("TimesRoman",Font.BOLD,16));
      b0 = new CalButton("0"); 
      b1 = new CalButton("1"); 
      b2 = new CalButton("2"); 
      b3 = new CalButton("3"); 
      b4 = new CalButton("4"); 
      b5 = new CalButton("5"); 
      b6 = new CalButton("6"); 
      b7 = new CalButton("7"); 
      b8 = new CalButton("8"); 
      b9 = new CalButton("9"); 
      bPN = new CalButton("+/-");
      bPoint = new CalButton("."); 
      // 加入按钮
      add(b7);  b7.addActionListener(new PressB7());  
      add(b8);  b8.addActionListener(new PressB8());  
      add(b9);  b9.addActionListener(new PressB9());  
      add(b4);  b4.addActionListener(new PressB4());  
      add(b5);  b5.addActionListener(new PressB5());  
      add(b6);  b6.addActionListener(new PressB6());  
      add(b1);  b1.addActionListener(new PressB1());  
      add(b2);  b2.addActionListener(new PressB2());  
      add(b3);  b3.addActionListener(new PressB3());  
      add(b0);  b0.addActionListener(new PressB0());  
      add(bPN); bPN.addActionListener(new PressBPN()); ;
      add(bPoint);  bPoint.addActionListener(new PressBPoint());//注册给PressBPoint对象 
    }
  }

  class CalPanelR extends Panel {
	    CalButton bSqrt, bSin, bCos, bYx,
	              bAdd, bSub, bMul, bDiv,
	              bInt, bEqual, bCE, bBack;
	    CalPanelR()
		{
	      setLayout(new GridLayout(4,3));
	      setFont(new Font("TimesRoman",Font.BOLD,16));
	      bDiv = new CalButton("/");
	      bAdd = new CalButton("+");
	      bSub = new CalButton("-");
	      bMul = new CalButton("*");
	      bSqrt = new CalButton("√"); 
	      bSin = new CalButton("sin");   
	      bCos = new CalButton("cos");   
	      bYx = new CalButton("y^x");    
	      bInt = new CalButton("int");
	      bEqual = new CalButton("=");   
	      bCE = new CalButton("CE");     
	      bBack = new CalButton("1/x");   
		  
	      add(bDiv);  bDiv.addActionListener(new PressBDiv()); 
	      add(bSqrt);  bSqrt.addActionListener(new PressBSqrt()); 
	      add(bInt);  bInt.addActionListener(new PressBInt()); 
	      add(bMul);  bMul.addActionListener(new PressBMul()); 
	      add(bSin);  bSin.addActionListener(new PressBSin()); 
	      add(bBack);  bBack.addActionListener(new PressBBack()); 
	      add(bSub);  bSub.addActionListener(new PressBSub()); 
	      add(bCos);  bCos.addActionListener(new PressBCos()); 
	      add(bCE);  bCE.addActionListener(new PressBCE()); 
	      add(bAdd);  bAdd.addActionListener(new PressBAdd()); 
	      add(bYx);  bYx.addActionListener(new PressBYx()); 
	      add(bEqual);  bEqual.addActionListener(new PressBEqual()); //注册给PressBEqual对象
	    }
  }

  class PressBAdd implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
        d1 = Double.parseDouble(tf.getText());
        op = 0;
        tf.setText("");
      } catch(Exception ee){}
    }
  }

  class PressBSub implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
        d1 = Double.parseDouble(tf.getText());
        op = 1;
        tf.setText("");
      } catch(Exception ee) {}
    }
  }

  
  class PressBMul implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	d1 = Double.parseDouble(tf.getText());
        op = 2;
        tf.setText("");
      } catch(Exception ee) {}
    }
  }

  class PressBDiv implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	d1 = Double.parseDouble(tf.getText());
        op = 3;
        tf.setText("");
      } catch(Exception ee) {}
    }
  }

  class PressBYx implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	d1 = Double.parseDouble(tf.getText());
        op = 4;
        tf.setText("");
      } catch(Exception ee) {}
    }
  }
  
  class PressBEqual implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	double result = 0;
        d2 = Double.parseDouble(tf.getText());
        switch(op) {
      	  case 0:
      	    result = d1 + d2;
      	    break;
          case 1:
            result = d1 - d2;
            break;
          case 2:
            result = d1 * d2;
            break;
          case 3:
            result = d1 / d2;
            break;
          case 4:
            result = Math.pow(d1,d2);
            break;
          default:
        }
        tf.setText(String.valueOf(result));
      } catch(Exception ee) {}
    }
  }
  
  class PressBSqrt implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	double x = Double.parseDouble(tf.getText());
        double y;
        y = Math.sqrt(x);
        tf.setText(y+"");
      } catch(Exception ee) {}
    }
  }

  class PressBInt implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	double x = Double.parseDouble(tf.getText());
        double y;
        y = Math.floor(x);
        tf.setText(y+"");
      } catch(Exception ee) {}
    }
  }
  
  class PressBCos implements  ActionListener {
	    public void actionPerformed(ActionEvent e) {
	      try {
	      	double x = Double.parseDouble(tf.getText());
	        double y;
	        y = Math.cos(x);
	        tf.setText(y+"");
	      } catch(Exception ee) {}
	    }
	  }
  
  class PressBSin implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
      	double x = Double.parseDouble(tf.getText());
        double y;
        y = Math.sin(x);
        tf.setText(y+"");
      } catch(Exception ee) {}
    }
  }
    
  

  class PressBBack implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
       double c= Double.parseDouble(tf.getText());
        tf.setText(""+1/c);
      } catch(Exception ee) {}
    }
  }
  
  class PressBCE implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      tf.setText("");
    }
  }
  
  class PressBPN implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      try {
        String text = tf.getText();
        if (text != "") {
          if(text.charAt(0) == '-')
            tf.setText(text.substring(1));
          else if(text.charAt(0) >= '0' && text.charAt(0) <= '9')
            tf.setText("-"+text.substring(0));
          
        }
      } catch(Exception ee) { }
      	
   }
  }
  
  class PressBPoint implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      if(text.lastIndexOf(".") == -1)
        tf.setText(text+".");
    }
  }
      
  class PressB0 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
        tf.setText(text+"0");
    }
  }
  
  class PressB1 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"1");
    }
  }

  class PressB2 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"2");
    }
  }

  class PressB3 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"3");
    }
  }

  class PressB4 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"4");
    }
  }

  class PressB5 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"5");
    }
  }

  class PressB6 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"6");
    }
  }

  class PressB7 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"7");
    }
  }

  class PressB8 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"8");
    }
  }

  class PressB9 implements  ActionListener {
    public void actionPerformed(ActionEvent e) {
      String text = tf.getText();
      tf.setText(text+"9");
    }
  }

  class Wclose extends WindowAdapter
  {
    public void windowClosing(WindowEvent e)
	{
      System.exit(0); 
    }
  }
}

